package com.chandon.juc.future.futuretask;

import java.util.concurrent.*;

/**
 * FutureTask为Future接口的基本实现，可基于FutureTask的方法取消/查看任务的结果。
 * 实现了RunableFuture接口，RunableFuture又继承了Runable与Future两个接口，所以可作为任务交给线程池处理。
 *
 * 7个状态：
 * NEW：表示一个新的任务，初始状态
 * COMPLETING：当任务被设置结果时，处于COMPLETING状态，这是一个中间状态。
 * NORMAL：表示任务正常结束。
 * EXCEPTIONAL：表示任务因异常而结束
 * CANCELLED：任务还未执行之前就调用了cancel(true)方法，任务处于CANCELLED
 * INTERRUPTING：当任务调用cancel(true)中断程序时，任务处于INTERRUPTING状态，这是一个中间状态。
 * INTERRUPTED：任务调用cancel(true)中断程序时会调用interrupt()方法中断线程运行，任务状态由INTERRUPTING转变为INTERRUPTED
 *
 * 可能的状态过渡：
 *  1、NEW -> COMPLETING -> NORMAL：正常结束
 *  2、NEW -> COMPLETING -> EXCEPTIONAL：异常结束
 *  3、NEW -> CANCELLED：任务被取消
 *  4、NEW -> INTERRUPTING -> INTERRUPTED：任务出现中断
 *
 * @author Dong
 */

public class FutureTaskTest {
	public static void main(String[] args) throws ExecutionException, InterruptedException {

		/* 使用Callable构造 */
		FutureTask<String> callableFutureTask = new FutureTask<String>(() -> {
			return "callable";
		});

		/* FutureTask直接使用Callbale运行 */
		callableFutureTask.run();

		/* 获取结果 */
		String s = callableFutureTask.get();
		System.out.println(s);

		/* 使用Runable运行，Runable本身没有返回值，result作用为运行成功的返回结果 */
		String result = "runable";
		FutureTask<String> runableTask = new FutureTask<>(() -> {
			System.out.println("Runable");
		}, result);

		runableTask.run();


		/* 使用线程池运行 */
		ExecutorService executorService = Executors.newCachedThreadPool();
		executorService.execute(callableFutureTask);


	}

}
